package _java8新特性;

import org.junit.Test;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * https://www.wdbyte.com/2019/11/jdk/jdk8-stream/#_2-stream-%E6%B5%81%E6%A6%82%E5%BF%B5
 *
 * 总结：Stream 数据源、处理流程、收集结果
 *
 * 1、创建流
 *      Arrays.stream(T arr)            // 从数组中获取流
 *              Arrays.stream(arr)          // arr.stream  idea 快捷方式
 *      "Collection".stream()           // 从集合数据结构中获取流
 *              list.stream()               // list 创建流
 *              set.stream()                // set 创建流
 *              map.entrySet().stream()     // map 创建流
 *              map.forEach()               // map 遍历流
 *      BufferedReader.lines()          // 从输入(文件)中获取流
 *
 *      IntStream.of()                  // 获取 int 流，使用 IntStream 接口类中的静态方法
 *      Stream.generate()               // 自己生成流
 *
 * 2、处理/转换数据，intermedia （惰性计算：在这个步骤中不管怎样操作，它返回的都是一个新的流对象，
 * 原始数据不会发生任何改变，而且这个步骤是惰性计算处理的，
 * 也就是说只调用方法并不会开始处理，只有在真正的开始收集结果时，中间操作才会生效，
 * 而且如果遍历没有完成，想要的结果已经获取到了（比如获取第一个值），会停止遍历，然后返回结果。
 * 惰性计算可以显著提高运行效率。）
 *      .map
 *      .flatMap
 *      .filter
 *      .distinct
 *      .sorted
 *      .limit
 *      .skip
 *      ...
 *
 * 3、收集结果
 *      常见的结果处理操作有 forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator 等。
 *      .forEach()
 *      .toArray()
 *      .collect(Collectors.toList()/Collectors.toSet()/Collectors.toMap())
 *      .min .max .sum .count
 *      .anyMatch .allMatch .noneMatch  .findAny .findFirst
 *      .reduce
 */
public class LN_02_Stream {

    // getStream
    IntStream intStream = IntStream.of(1, 2, 4, 5);
    Stream<Integer> integerStream = Arrays.stream(new Integer[]{1,2,3,4});
    Stream<String> stringStream = new ArrayList<String>().stream();

    @Test
    public void getIntStream() {
        // https://blog.csdn.net/qq_31865983/article/details/106443244
        // .of() / .build()  可指定int流中包含的具体单个元素
        IntStream intStream1 = IntStream.of(1, 3, 5, 7);
        IntStream intStream2 = IntStream.builder().add(2).add(4).add(6).build();
        // .range() / rangeClosed()  将指定范围内的元素都添加到int流中，前者不包含最后一个元素，后者包含
        IntStream intStream3 = IntStream.range(1, 5);
        IntStream intStream4 = IntStream.rangeClosed(1, 5);
        // .generate() / .iterate()  指定生成int流中int元素的生成函数，前者的生成函数没有入参，后者会将前一次调用结果作为下一次调用生成函数的入参
        // .concat()  将两个int流合并成一个

        System.out.println(Arrays.toString(intStream1.toArray()));
        System.out.println(Arrays.toString(intStream2.toArray()));
        System.out.println(Arrays.toString(intStream3.toArray()));
        System.out.println(Arrays.toString(intStream4.toArray()));
    }

    @Test
    public void getFileStream() throws FileNotFoundException {
        BufferedReader bufferedReader = new BufferedReader(new FileReader("/Users/liuhuan/IdeaProjects/leetcode/commit.txt"));
        Stream<String> fileStream = bufferedReader.lines();
        fileStream.forEach(line -> System.out.println(line));
    }

    @Test
    public void processAndCollect() {

    }

}
